home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / pp / pp-6.0 / Lib / format / rfc2reprecip.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-12-18  |  5.1 KB  |  317 lines

  1. /* rfc2reprecip.c - Converts a RFC string into a Rrseq struct */
  2.  
  3. # ifndef lint
  4. static char Rcsid[] = "@(#)$Header: /xtel/pp/pp-beta/Lib/format/RCS/rfc2reprecip.c,v 6.0 1991/12/18 20:22:06 jpo Rel $";
  5. # endif
  6.  
  7. /*
  8.  * $Header: /xtel/pp/pp-beta/Lib/format/RCS/rfc2reprecip.c,v 6.0 1991/12/18 20:22:06 jpo Rel $
  9.  *
  10.  * $Log: rfc2reprecip.c,v $
  11.  * Revision 6.0  1991/12/18  20:22:06  jpo
  12.  * Release 6.0
  13.  *
  14.  */
  15.  
  16.  
  17.  
  18. #include "util.h"
  19. #include <isode/cmd_srch.h>
  20. #include "dr.h"
  21.  
  22.  
  23.  
  24. extern CMD_TABLE        drtbl_rep[];
  25.  
  26.  
  27. extern void encodedinfo_free ();
  28.  
  29. static char             *rfc2lastrace(),
  30.             *rfc2report();
  31.  
  32. #define    txt2int(n)    atoi(n)
  33.  
  34.  
  35. /* ---------------------  Begin  Routines  -------------------------------- */
  36.  
  37.  
  38.  
  39.  
  40. int rfc2reprecip (rp, ap, str)
  41. Rrinfo          *rp;
  42. ADDR        *ap;
  43. char            *str;
  44. {
  45.     char    *cp = str,
  46.         *bp = str;
  47.  
  48.  
  49.     PP_DBG (("Lib/pp/rfc2reprecip(%s)", str));
  50.  
  51.  
  52.     /* -- OR address -- */
  53.     if ((cp = index (str, ';')) == NULLCP)
  54.         return NOTOK;
  55.     else {
  56.         *cp++ = '\0';
  57.         rp -> rr_recip = ap -> ad_no;
  58.     }
  59.  
  60.  
  61.     /* -- last-trace -- */
  62.     if (*cp == ' ')
  63.         cp++;
  64.     bp = cp;
  65.     cp = rfc2lastrace (rp, bp);
  66.     if (cp == NULLCP)
  67.         return NOTOK;
  68.     if (*++cp != ';')
  69.         return NOTOK;
  70.     else
  71.         cp++;
  72.  
  73.  
  74.     /* -- ext -- */
  75.     if (*cp == ' ')
  76.         cp++;
  77.     bp = cp;
  78.     if ((cp = index (bp, ' ')) == NULLCP)
  79.         return NOTOK;
  80.     else {
  81.         *cp++ = '\0';
  82.         if (lexequ (bp, "ext") != 0)
  83.             return NOTOK;
  84.         bp = cp;
  85.         if ((cp = index (bp, ' ')) == NULLCP)
  86.             return NOTOK;
  87.         else {
  88.             *cp++ = '\0';
  89.             rp->rr_recip = txt2int (bp);
  90.         }
  91.     }
  92.  
  93.  
  94.     /* -- flags -- */
  95.     bp = cp;
  96.     if ((cp = index (bp, ' ')) == NULLCP)
  97.         return NOTOK;
  98.     else {
  99.         *cp++ = '\0';
  100.         if (lexequ (bp, "flags") != 0)
  101.             return NOTOK;
  102.         bp = cp;
  103.         if ((cp = index (bp, ' ')) != NULLCP)
  104.             *cp++ = '\0';
  105.     }
  106.  
  107.  
  108.     /* -- the rest is optional -- */
  109.     if (cp == NULLCP)
  110.         return OK;
  111.  
  112.  
  113.     /* -- intended -- */
  114.     bp = cp;
  115.     if ((cp = index (bp, ' ')) == NULLCP)
  116.         return NOTOK;
  117.     else
  118.         *cp++ = '\0';
  119.  
  120.     if (lexequ (bp, "intended") == 0) {
  121.         bp = cp;
  122.         if ((cp = index (bp, ' ')) != NULLCP)
  123.             *cp++ = '\0';
  124.         if (rp -> rr_originally_intended_recip == NULL) {
  125.             rp -> rr_originally_intended_recip =
  126.                 (FullName *) smalloc (sizeof (FullName));
  127.             bzero ((char *)rp -> rr_originally_intended_recip,
  128.                    sizeof (FullName));
  129.         }
  130.         rp->rr_originally_intended_recip -> fn_addr = strdup (bp);
  131.         if (cp == NULLCP)
  132.             return OK;
  133.         bp = cp;
  134.         if ((cp = index (bp, ' ')) == NULLCP)
  135.             return NOTOK;
  136.         else
  137.             *cp++ = '\0';
  138.     }
  139.  
  140.  
  141.     /* -- info -- */
  142.     if (lexequ (bp, "info") == 0) {
  143.         bp = cp;
  144.         rp->rr_supplementary = strdup (bp);
  145.     }
  146.     else
  147.         return NOTOK;
  148.  
  149.  
  150.     return OK;
  151. }
  152.  
  153.  
  154.  
  155.  
  156. /* ---------------------  Static  Routines  ------------------------------- */
  157.  
  158.  
  159.  
  160.  
  161. static char *rfc2lastrace (rp, str)
  162. Rrinfo        *rp;
  163. char            *str;
  164. {
  165.     EncodedIT       *new;
  166.     char            *cp = str,
  167.             *bp = str;
  168.  
  169.  
  170.     PP_DBG (("Lib/rfc2lastrace (%s)", str));
  171.  
  172.  
  173.     /* -- drc-report -- */
  174.     cp = rfc2report (&rp -> rr_report, str);
  175.     if (cp == NULLCP)
  176.         return NULLCP;
  177.     if (*++cp != ';')
  178.         return NULLCP;
  179.     else
  180.         cp++;
  181.  
  182.  
  183.  
  184.     /* -- date-time -- */
  185.     if (*cp == ' ')
  186.         cp++;
  187.     bp = cp;
  188.     if ((cp = index (bp, ';')) == NULLCP)
  189.         return NULLCP;
  190.     else {
  191.         *cp++ = '\0';
  192.         if (rfc2UTC (bp, &rp->rr_arrival) == NOTOK)
  193.             rp -> rr_arrival = utcnow ();
  194.     }
  195.  
  196.  
  197.     /* -- converted (optional) -- */
  198.     bp = cp;
  199.     if (*bp == ' ')
  200.         bp++;
  201.  
  202.     if ((cp = index (bp, '(')) == NULLCP)
  203.         return --bp;
  204.     else {
  205.         *cp = '\0';
  206.         if (lexequ (bp, "converted") != 0) {
  207.             *cp = '(';
  208.             return --bp;
  209.         }
  210.         else
  211.             bp = ++cp;
  212.     }
  213.     if ((cp = index (bp, ')')) == NULLCP)
  214.         return NULLCP;
  215.     else
  216.         *cp = '\0';
  217.  
  218.     /* -- create a new Encoded struct -- */
  219.     new = (EncodedIT *) smalloc (sizeof (*new));
  220.     bzero ((char*)new, sizeof (*new));
  221.     if (rfc2encinfo (new, bp) == NOTOK) {
  222.         encodedinfo_free (new);
  223.         return NULLCP;
  224.     }
  225.     else
  226.         rp->rr_converted = new;
  227.  
  228.     return cp;
  229. }
  230.  
  231.  
  232.  
  233.  
  234. static char *rfc2report (rp, str)
  235. Report   *rp;
  236. char    *str;
  237. {
  238.     char    *cp = str,
  239.         *bp = str;
  240.  
  241.     int     retval;
  242.  
  243.  
  244.     PP_DBG (("Lib/rfc2report (%s)", str));
  245.  
  246.  
  247.     if ((cp = index (str, ' ')) == NULLCP)
  248.         return NULLCP;
  249.     else
  250.         *cp++ = '\0';
  251.  
  252.     switch (rp->rep_type = cmd_srch (bp, drtbl_rep)) {
  253.     case DR_REP_SUCCESS:
  254.         bp = cp;
  255.         if ((cp = index (bp, ';')) == NULLCP)
  256.             return NULLCP;
  257.         else {
  258.             *cp++ = '\0';
  259.             retval = rfc2UTC (bp, &rp->rep.rep_dinfo.del_time);
  260.             if (retval == NOTOK)
  261.                 return NULLCP;
  262.             if (*cp == ' ')
  263.                 cp++;
  264.             bp = cp;
  265.             if ((cp = index (bp, ';')) == NULLCP)
  266.                 return NULLCP;
  267.             else {
  268.                 *cp = '\0';
  269.                 rp->rep.rep_dinfo.del_type = txt2int (bp);
  270.                 *cp = ';';
  271.                 --cp;
  272.             }
  273.         }
  274.         break;
  275.  
  276.  
  277.     case DR_REP_FAILURE:
  278.         /* -- reason code -- */
  279.         bp = cp;
  280.         if ((cp = index (bp, '(')) == NULLCP)
  281.             return NULLCP;
  282.         else {
  283.             *cp++ = '\0';
  284.             rp->rep.rep_ndinfo.nd_rcode = atoi (bp);
  285.         }
  286.  
  287.         /* -- diagnostic code -- */
  288.         bp = cp;
  289.         if ((cp = index (bp, ';')) == NULLCP)
  290.             return NULLCP;
  291.         else {
  292.             bp = ++cp;
  293.  
  294.             /* -- no diagnostic given -- */
  295.             if ((cp = index (bp, '(')) == NULLCP)
  296.                 return --bp;
  297.             else
  298.                 *cp++ = '\0';
  299.  
  300.             bp = cp;
  301.  
  302.             rp->rep.rep_ndinfo.nd_dcode = atoi (bp);
  303.  
  304.             if ((cp = index (bp, ';')) == NULLCP)
  305.                 return NULLCP;
  306.         }
  307.         break;
  308.     default:
  309.         return NULLCP;
  310.     }
  311.  
  312.  
  313.     PP_DBG (("Lib/rfc2report returns ... (%s)", cp));
  314.  
  315.     return cp;
  316. }
  317.